
/**
 * 经纬度坐标转球面坐标  
 * @param {地球半径} R  
 * @param {经度(角度值)} longitude 
 * @param {维度(角度值)} latitude
 */
function lon2xyz(R,longitude,latitude) {
  var lon = longitude * Math.PI / 180;//转弧度值
  var lat = latitude * Math.PI / 180;//转弧度值
  lon = -lon;// three.js坐标系z坐标轴对应经度-90度，而不是90度
  
  // 经纬度坐标转球面坐标计算公式
  var x = R * Math.cos(lat) * Math.cos(lon);
  var y = R * Math.sin(lat);
  var z = R * Math.cos(lat) * Math.sin(lon);
  // 返回球面坐标
  return {
    x:x,
    y:y,
    z:z,
  };
}

/**
 * 在球面上移动,从已知startPoint向dir方向移动dis距离得到EndPoint，返回其球面上的坐标
 * @param {startPoint} 当前在地面的位置
 * @param {dis} 移动距离，1-6，单位是周长的1/36，即每走1步是10度
 * @param {R} 地球半径
 * @param {dir} 方向,只取东西南北，分别是0、1、2、3
 * 返回p3 {x,y,z}
 * 认为平行于XOZ面的移动为东西，垂直于XOZ面的移动为南北
 * 球面参数方程中为
 * x=Rsinψcosθ
 * y=Rsinψsinθ
 * z=Rcosθ
 * 其中θ为方位角，ψ为仰角。
 * 东西走时改变方位角θ，向东，θ就一直增加，超过360度后减360度；向西θ减小
 * 南北走时改变仰角
 * -------------p1,p2为第一第二点，返回第三点
 */
function xyz2xyz(p1,p2,dis,R,dir) {
  let p3={}
  p3.x=0;
  p3.y=0;
  p3.z=0;
  if(dir==1 || dir==3){//向后和向右时反方向
    dis=-dis;
  }
  if(dir==0 || dir==1){ //向前向后
    if(Math.abs(p1.x-p2.x)<0.00001 ){
      p3.x=p2.x;
      p3.y=dis*(p2.y-p1.y);
    }
    if(Math.abs(p1.y-p2.y)<0.00001 ){
      p3.y=p2.y;
      p3.x=dis*(p2.x-p1.x);
    }
  }
  if(dir==2 || dir==3){ //向左向右
    if(Math.abs(p1.x-p2.x)<0.00001 ){
      p3.y=p2.y;
      p3.x=p2.x-dis*(p2.y-p1.y);
    }
    if(Math.abs(p1.y-p2.y)<0.00001 ){
      p3.x=p2.x;
      p3.y=p2.y+dis*(p2.x-p1.x);
    }
  }
  p3.z=Math.sqrt(R*R-p3.x*p3.x-p3.y*p3.y);
  return p3;
}

/**
 * 在球面上连线平行于赤道或垂直于赤道的两个端点间连线
 * @param {point1,point2} 之前及当前在地面的位置
 * @param {dis} 移动距离，1-6，单位是周长的1/36，即每走1步是10度
 * @param {R} 地球半径
 * @param {dir} 方向,只取东西南北，分别是0、1、2、3
 * 返回一组LineCurve3，调用处将LineCurve3全部加入场景即可
 * 认为平行于XOZ面的移动为东西，垂直于XOZ面的移动为南北
 */
function getLinesFrom2Point(p1,p2,dis,R,dir) {

  dis=Math.abs(dis)//存入库中的dis有正有负，这里不需要

  if(Math.abs(p1.y-p2.y)<0.00001){ //认为是平行于XOZ面的移动
    
  }

}

/**
 * 在球面上随机取一个点
 * 球面从0度到360度每10度做一经线，共0-35，36个经线
 * 纬线：0海拔一条，两边各9条，南北极各成为一个点，共19个纬线
 * 表面上一共614个点
 */
function getRandomPoint(R){

  let point={}
  //取0-35的随机数
  let xjiao=Math.floor(Math.random()*(36));
  //取0-34的随机数
  let yjiao=Math.floor(Math.random()*(10));

  let ta = xjiao*10 * Math.PI / 180;
  let tb = yjiao*10 * Math.PI / 180;
  let tR = R * Math.cos(ta)
  let z = R * Math.sin(ta)
  let x = tR * Math.cos(tb)
  let y = tR * Math.sin(tb)

  if(yjiao==9){ //y在南北两极时，x只能等于0
     x=0;
  }
  
  let yzf=[1,2][Math.round(Math.random())];

  if(yzf==1){ y=-1*y }

  point.x=x;
  point.y=y;
  point.z=z;

  return point;
  
}


export { lon2xyz,xyz2xyz,getRandomPoint,getLinesFrom2Point }